#include "gpio.h"
#include <stdint.h>
#include <stdlib.h> 
#include <string.h> 

#define GPIO_MAX_NUM 10

/**
 * @brief 用于判断GPIO的中断模式
 * 
 */
typedef enum 
{
    GPIO_EXTI_NONE,
    GPIO_EXTI_RISING,
    GPIO_EXTI_FALLING,
    GPIO_EXTI_RISING_AND_FALLING,
} GPIO_EXTI_MODE_e;

/**
 * @brief GPIO的实例结构体定义
 * 
 */
typedef struct gpio
{
    GPIO_TypeDef*       GPIOx;
    GPIO_PinState       Pin_State;
    uint16_t            GPIO_Pin;
    GPIO_EXTI_MODE_e    EXTI_Mode;
    void(* gpio_exti_callback)(struct gpio *);
    void* id;
} GPIOInstance;

/**
 * @brief GPIO的初始化配置结构体定义
 * 
 */
typedef struct
{
    GPIO_TypeDef*       GPIOx;
    GPIO_PinState       Pin_State;
    uint16_t            GPIO_Pin;
    GPIO_EXTI_MODE_e    EXTI_Mode;
    void(* gpio_exti_callback)(GPIOInstance *);
    void* id;
} GPIO_Init_Config_s;

/**
 * @brief 初始化GPIO
 * 
 * @param GPIO_Init_Config_s* _config
 * @return GPIOInstance*
 */
GPIOInstance* GPIOInit(GPIO_Init_Config_s* _config);

/**
 * @brief 切换GPIO电平
 * 
 * @param GPIO实例
 * @return void
 */
void GPIOToggle(GPIOInstance* _instance);

/**
 * @brief 设置GPIO电平为高
 * 
 * @param GPIO实例
 * @return void
 */
void GPIOSet(GPIOInstance* _instance);

/**
 * @brief 设置GPIO电平为低
 * 
 * @param GPIO实例
 * @return void
 */
void GPIOReset(GPIOInstance* _instance);

/**
 * @brief 读取GPIO电平
 * 
 * @param GPIO实例
 * @return GPIO_PinState
 */
GPIO_PinState GPIORead(GPIOInstance* _instance);
